// 引入必要的模块
import Koa from 'koa';
import Router from 'koa-router';
import bodyParser from 'koa-bodyparser';
import cors from '@koa/cors';
import { Sequelize, DataTypes } from 'sequelize';
import dotenv from 'dotenv';
dotenv.config();

// JWT 相关
import jwt from 'jsonwebtoken';
const { sign } = jwt;

// 密码哈希相关
import bcrypt from 'bcryptjs';
const { hash, compare } = bcrypt;

// 初始化Koa应用
const app = new Koa();
const router = new Router();
const PORT = process.env.PORT || 3000;

// 数据库配置
const sequelize = new Sequelize('userdemo', 'root', '123456', {
  host: 'localhost',
  dialect: 'mysql',
  logging: false // 关闭SQL日志输出
});

// 用户模型
const User = sequelize.define('User', {
  username: DataTypes.STRING,
  password: DataTypes.STRING 
});

// 同步数据库并创建测试用户
(async () => {
  try {
    await sequelize.sync({ force: true });
    console.log('数据库同步成功');
    
    await User.bulkCreate([
      { username: 'admin', password: await hash('123456', 10) } // 使用哈希密码
    ]);
    console.log('测试用户创建成功');
  } catch (error) {
    console.error('数据库初始化失败:', error);
  }
})();

// 注册路由
router.post('/register', async (ctx) => {
  try {
    const { username, password } = ctx.request.body;

    // 检查用户名是否已存在
    const existingUser = await User.findOne({ where: { username } });
    if (existingUser) {
      ctx.status = 400;
      ctx.body = { message: '用户名已存在' };
      return;
    }

    // 哈希密码
    const hashedPassword = await hash(password, 10);

    // 创建用户
    await User.create({ username, password: hashedPassword });

    ctx.status = 201;
    ctx.body = { message: '用户注册成功' };
  } catch (error) {
    ctx.status = 500;
    ctx.body = { message: '注册失败', error: error.message };
  }
});

// 登录路由
router.post('/login', async (ctx) => {
  console.log('Login request received:', ctx.request.body); // 调试日志
  try {
    const { username, password } = ctx.request.body;

    // 查找用户
    const user = await User.findOne({ where: { username } });
    if (!user) {
      ctx.status = 401;
      ctx.body = { message: '用户名或密码错误' };
      return;
    }

    // 验证密码
    const isPasswordValid = await compare(password, user.password);
    if (!isPasswordValid) {
      ctx.status = 401;
      ctx.body = { message: '用户名或密码错误' };
      return;
    }

    // 生成JWT
    const token = sign({ userId: user.id }, process.env.JWTSECRET, { expiresIn: '1h' });

    ctx.status = 200;
    ctx.body = { message: '登录成功', token };
  } catch (error) {
    console.error('Login error:', error); // 错误日志
    ctx.status = 500;
    ctx.body = { message: '登录失败', error: error.message };
  }
});

// 处理忘记密码请求 - 支持重置密码
router.post('/forgotPassword', async (ctx) => {
  try {
    const { username, newPassword } = ctx.request.body;

    // 检查用户是否存在
    const user = await User.findOne({ where: { username } });
    if (!user) {
      ctx.status = 404;
      ctx.body = { success: false, message: '用户不存在' };
      return;
    }

    if (!newPassword) {
      // 仅校验用户存在
      ctx.body = { success: true, message: '用户存在，可以重置密码' };
      return;
    }

    // 重置密码
    const hashedPassword = await hash(newPassword, 10);
    user.password = hashedPassword;
    await user.save();

    ctx.body = { success: true, message: '密码重置成功' };
  } catch (error) {
    ctx.status = 500;
    ctx.body = { success: false, message: error.message || '服务器错误' };
  }
});

// 使用中间件
app.use(cors({
  origin: '*',
  methods: ['GET', 'POST'],
  allowedHeaders: ['Content-Type', 'Authorization']
}));
app.use(bodyParser());
app.use(router.routes());
app.use(router.allowedMethods());

// 启动服务器
app.listen(PORT, () => {
  console.log(`服务器运行在端口 http://localhost:${PORT}`);
});
